#include "../../src/server.hpp"
#include <iostream>

// 简单的Socket基础功能测试
void test_basic_socket() {
    std::cout << "=== Socket基础功能测试 ===" << std::endl;
    
    Socket sock;
    
    // 测试创建套接字
    if (sock.create()) {
        INF_LOG("Socket创建成功");
    } else {
        ERR_LOG("Socket创建失败");
        return;
    }
    
    // 测试设置重用地址
    sock.ReuseAddress();
    INF_LOG("地址重用设置完成");
    
    // 测试绑定（使用一个随机端口）
    if (sock.bind("127.0.0.1", 0)) {  // 端口0表示系统自动分配
        INF_LOG("Socket绑定成功");
    } else {
        ERR_LOG("Socket绑定失败");
    }
    
    // 测试监听
    if (sock.listen()) {
        INF_LOG("Socket监听成功");
    } else {
        ERR_LOG("Socket监听失败");
    }
    
    // 测试设置非阻塞
    sock.NonBlock();
    INF_LOG("非阻塞模式设置完成");
    
    // 测试非阻塞accept（应该立即返回-1，因为没有连接）
    int client_fd = sock.accept();
    if (client_fd < 0) {
        INF_LOG("非阻塞accept正常返回-1（无连接）");
    }
    
    // 测试关闭
    sock.Close();
    INF_LOG("Socket关闭完成");
    
    std::cout << "✅ Socket基础功能测试通过！" << std::endl;
}

// 测试便捷创建函数
void test_convenience_functions() {
    std::cout << "\n=== 便捷创建函数测试 ===" << std::endl;
    
    // 测试CreateServer
    Socket server;
    if (server.CreateServer(8888, "127.0.0.1", false)) {
        INF_LOG("CreateServer 成功：127.0.0.1:8888");
        server.Close();
    } else {
        ERR_LOG("CreateServer 失败");
    }
    
    // 测试CreateServer非阻塞模式
    Socket server_nb;
    if (server_nb.CreateServer(8889, "127.0.0.1", true)) {
        INF_LOG("CreateServer 非阻塞模式成功：127.0.0.1:8889");
        server_nb.Close();
    } else {
        ERR_LOG("CreateServer 非阻塞模式失败");
    }
    
    std::cout << "✅ 便捷创建函数测试通过！" << std::endl;
}

// 测试错误处理
void test_error_handling() {
    std::cout << "\n=== 错误处理测试 ===" << std::endl;
    
    Socket sock;
    
    // 测试在未创建socket时绑定（应该失败）
    if (!sock.bind("127.0.0.1", 8890)) {
        INF_LOG("✅ 正确检测到未创建socket的绑定错误");
    }
    
    // 测试绑定无效IP（应该失败）
    sock.create();
    if (!sock.bind("999.999.999.999", 8891)) {
        INF_LOG("✅ 正确检测到无效IP地址错误");
    }
    
    // 测试绑定已占用端口
    Socket sock1, sock2;
    sock1.CreateServer(8892, "127.0.0.1");
    if (!sock2.CreateServer(8892, "127.0.0.1")) {
        INF_LOG("✅ 正确检测到端口已占用错误");
    }
    
    sock1.Close();
    sock2.Close();
    
    std::cout << "✅ 错误处理测试通过！" << std::endl;
}

int main() {
    std::cout << "🚀 开始Socket类简单测试\n" << std::endl;
    
    // 基础功能测试
    test_basic_socket();
    
    // 便捷函数测试
    test_convenience_functions();
    
    // 错误处理测试
    test_error_handling();
    
    std::cout << "\n🎉 所有简单测试完成！Socket类基础功能正常！" << std::endl;
    std::cout << "\n💡 提示：运行 'make test' 进行完整测试" << std::endl;
    
    return 0;
}
